package main

import (
	"context"
	"grpc-example/protobuf/echo"
	"log"
	"net"

	"google.golang.org/grpc"
)

/*
1）定义一个结构体，必须包含pb.UnimplementedGreeterServer 对象；
2）实现 .proto文件中定义的API；
3）将服务描述及其具体实现注册到 gRPC 中；
4）启动服务。
*/
const (
	port = ":50051"
)

type EchoServer struct {
	echo.UnimplementedEchoServer
}

// UnaryEcho 一个普通的UnaryAPI
func (e *EchoServer) UnaryEcho(ctx context.Context, req *echo.EchoRequest) (*echo.EchoResponse, error) {
	log.Printf("Recved: %v", req.GetMessage())
	resp := &echo.EchoResponse{Message: req.GetMessage()}
	return resp, nil
}

func main() {
	listen, err := net.Listen("tcp", port)
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	s := grpc.NewServer()
	// 将服务描述(server)及其具体实现(EchoServer)注册到 gRPC 中去.
	// 内部使用的是一个 map 结构存储，类似 HTTP server。
	echo.RegisterEchoServer(s, &EchoServer{})
	log.Println("Serving gRPC on 0.0.0.0" + port)
	if err := s.Serve(listen); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}
